#ifndef _HELIX_PHYSICS_OBJECT_H_
#define _HELIX_PHYSICS_OBJECT_H_

#include "../../Helix.h"
#include "../../HObject.h"
#include "../../Log.h"
#include "../../Math/HelixMath.h"
#include "../HelixMesh.h"
#include "PhysObjRepresentation.h"

namespace helix
{

	/** This class is an interface to a physically simulated object in a physics engine.
	*	Implementors of a physics engine should implement this interface and the Physics
	*	object.
	*/
	class MY_CLASS PhysObject : public HObject 
	{
	public:

		/** Default destructor
		*/
		virtual ~PhysObject()
		{
		}

		/**	Change the world position of this physics object to the one specified in the Vector.
		*	\warning Changing an objects position via this method does not guarantee that 
		*	the object will collide with anything that is between its current and new positions
		*	\param pos A vector that contains the new world position of the object
		*/
		virtual void setPosition(Vector pos) = 0;

		/**	Change the mass of this object
		*	\note Some physics engines will let you give an object an infinite mass.  Generally this 
		*	is reserved for things like cutscenes, or platforms, or anything that should not be affected
		*	by collisions of other objects.  Use a negative value to specify that this object should have
		*	an infinite mass.
		*	\param pos A vector that contains the new world position of the object
		*/
		virtual void setMass(float mass) = 0;

		/**	Change the velocity of this physics object to the one specified in the Vector.
		*	\param vel A vector that contains the new velocity of the object
		*/
		virtual void setVelocity(Vector vel) = 0;

		/**	Get the object's current position
		*	\return a Vector containing the world position of the object
		*/
		virtual Vector getPosition() = 0;

		/**	Get the object's current velocity
		*	\return a Vector containing the object's velocity
		*/
		virtual Vector getVelocity() = 0;

		
		/**	Get the object's mass
		*	\return the object's mass.  If the mass is infinite, a negative value will be returned.
		*/
		virtual float getMass() = 0;

		/**	Tells whether or not this object has static geometry
		*	\return true if the object is static, false if it is dynamic
		*/
		virtual bool isStatic() = 0;

		/** Get the current position and orientation of the object in world space
		*	\return A Matrix4x4 object that contains the position and orientation of the object
		*/
		virtual Matrix4x4 getTransformationMatrix() = 0;
	};

}

#endif